import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.resps.Tuple;

import java.util.List;
import java.util.Set;


public class RedisSet_Zset {
    /**
     * sadd smembers
     * @param jedis
     */
    private static void testSaddAndSmembers(Jedis jedis){
        jedis.sadd("key","aaa","bbb","ccc");
        Set<String> key = jedis.smembers("key");
        System.out.println(key);
    }

    /**
     * srem sismember
     * @param jedis
     */
    private static void testSremAndSismember(Jedis jedis){
        jedis.sadd("key","aaa","bbb","ccc");
        boolean sismember = jedis.sismember("key", "aaa");
        System.out.println(sismember);
//        从 Set 集合 key 中移除元素 aaa 和 bbb。
        long srem = jedis.srem("key", "aaa", "bbb");
        System.out.println(srem);
        sismember=jedis.sismember("key","aaa");
        System.out.println(sismember);
    }

    /**   scard  主要功能是获取集合中元素的数量
     * @param jedis
     */
    private static void testScard(Jedis jedis){
        jedis.sadd("key","aaa","bbb","ccc");
        long key = jedis.scard("key");
        System.out.println(key);
    }

    /**
     * sinter  对两个集合去交集
     * @param jedis
     */
    private static void testSinter(Jedis jedis){
        jedis.sadd("key","aaa","bbb","ccc");
        jedis.sadd("key1","aaa","bbb","ddd");
        Set<String> sinter = jedis.sinter("key", "key1");
        long sinterstore = jedis.sinterstore("key2", "key", "key1");
        System.out.println(sinterstore);
        System.out.println(sinter);
    }

    /**
     * sunion 两个集合取并集
     * @param jedis
     */

    private static void testSunion(Jedis jedis){
        jedis.sadd("key","aaa","bbb","ccc");
        jedis.sadd("key1","aaa","bbb","ddd");
        Set<String> sunion = jedis.sunion("key", "key1");
        System.out.println(sunion);

    }

    /**
     * sdiff  两个集合做差
     * @param jedis
     */
    public static void testSdiff(Jedis jedis){
        jedis.sadd("key","aaa","bbb","ccc");
        jedis.sadd("key1","aaa","bbb","ddd");
        Set<String> sunion = jedis.sdiff("key", "key1");
        System.out.println(sunion);
    }

//    "=================================ZSET================================="

    /**
     * zadd 和 zrange
     * @param jedis
     */
    private static void testZaddAndZrange(Jedis jedis){
        jedis.zadd("key",100,"吕布");
        jedis.zadd("key",98,"赵云");
        jedis.zadd("key",95,"典韦");
        jedis.zadd("key",92,"关羽");
        List<String> key = jedis.zrange("key", 0, 3);
        System.out.println(key);
    }

    /**
     * zrem 删除key中的member   zcard 统计key中member的个数
     * @param jedis
     */
    private static void testZremAndZcard(Jedis jedis){
        jedis.zadd("key",100,"吕布");
        jedis.zadd("key",98,"赵云");
        jedis.zadd("key",95,"典韦");
        jedis.zadd("key",92,"关羽");
        long key = jedis.zcard("key");
        System.out.println(key);
        long zrem = jedis.zrem("key", "吕布", "赵云");
        System.out.println(zrem);
        key=jedis.zcard("key");
        System.out.println(key);

    }

    private static void testZcount(Jedis jedis){
        jedis.zadd("key",100,"吕布");
        jedis.zadd("key",98,"赵云");
        jedis.zadd("key",95,"典韦");
        jedis.zadd("key",92,"关羽");
        long key = jedis.zcount("key", 92, 98);
        System.out.println(key);
    }

    /**
     * zpopmax zpopmin
     * @param jedis
     */
    private static void testZpopmaxAndZpopmin(Jedis jedis){
        jedis.zadd("key",100,"吕布");
        jedis.zadd("key",98,"赵云");
        jedis.zadd("key",95,"典韦");
        jedis.zadd("key",92,"关羽");
        Tuple key = jedis.zpopmax("key");
        System.out.println(key);
        key=jedis.zpopmin("key");
        System.out.println(key);
    }

    /**
     * zrank 升序获得下标
     * zrevrank 降序获得下标
     * @param jedis
     */
    private static void testZrank(Jedis jedis){
        jedis.zadd("key",100,"吕布");
        jedis.zadd("key",98,"赵云");
        jedis.zadd("key",95,"典韦");
        jedis.zadd("key",92,"关羽");
        Long zrank = jedis.zrank("key", "赵云");
        System.out.println(zrank);
        zrank=jedis.zrevrank("key","赵云");
        System.out.println(zrank);

    }

    /**
     * zscore
     * @param jedis
     */
    private static void testZscore(Jedis jedis){
        jedis.zadd("key",100,"吕布");
        jedis.zadd("key",98,"赵云");
        jedis.zadd("key",95,"典韦");
        jedis.zadd("key",92,"关羽");
        Double zscore = jedis.zscore("key", "赵云");
        System.out.println(zscore);

    }
    private static void testZincrBy(Jedis jedis){
        jedis.zadd("key",100,"吕布");
//        jedis.zadd("key",98,"赵云");
//        jedis.zadd("key",95,"典韦");
//        jedis.zadd("key",92,"关羽");
        double zincrby = jedis.zincrby("key", 10, "吕布");
        System.out.println(zincrby);
        zincrby=jedis.zincrby("key",-20,"吕布");
        System.out.println(zincrby);
    }

    /**
     * zinterstore 求两个zest的交集 并放入新的key中
     * @param jedis
     */
    private static void testZinterstore(Jedis jedis){
        jedis.zadd("key",100,"吕布");
        jedis.zadd("key",98,"赵云");
        jedis.zadd("key",95,"典韦");
//        jedis.zadd("key",92,"关羽");

        jedis.zadd("key1",100,"吕布");
        jedis.zadd("key1",98,"赵云");
//        jedis.zadd("key1",95,"典韦");
        jedis.zadd("key1",92,"关羽");

        long zinterstore = jedis.zinterstore("key2", "key", "key1");
        System.out.println(zinterstore);
        List<Tuple> key2 = jedis.zrangeWithScores("key2", 0, -1);
        System.out.println(key2);

    }

    /**
     * zunionstore 求两个zest的并集 并放入新的key中
     * @param jedis
     */
    private static void testZunionstore(Jedis jedis){
        jedis.zadd("key",100,"吕布");
        jedis.zadd("key",98,"赵云");
        jedis.zadd("key",95,"典韦");
//        jedis.zadd("key",92,"关羽");

        jedis.zadd("key1",100,"吕布");
        jedis.zadd("key1",98,"赵云");
//        jedis.zadd("key1",95,"典韦");
        jedis.zadd("key1",92,"关羽");

        long zinterstore = jedis.zunionstore("key2", "key", "key1");
        System.out.println(zinterstore);
        List<Tuple> key2 = jedis.zrangeWithScores("key2", 0, -1);
        System.out.println(key2);

    }





    public static void main(String[] args) {
        JedisPool jedisPool=new JedisPool("tcp://127.0.0.1:8888");
        try(Jedis jedis=jedisPool.getResource()){
//            testSaddAndSmembers(jedis);
//            testSremAndSismember(jedis);
//            testScard(jedis);
            testSinter(jedis);
//            testSunion(jedis);
//            testSdiff(jedis);
//            testZaddAndZrange(jedis);
//            testZremAndZcard(jedis);
//            testZcount(jedis);
//            testZpopmaxAndZpopmin(jedis);
//            testZrank(jedis);
//            testZscore(jedis);
//            testZincrBy(jedis);
//            testZinterstore(jedis);
//            testZunionstore(jedis);
        }
    }
}
